package com.wy.tingshu.repository;

import com.wy.tingshu.data_object.UserDO;
import com.wy.tingshu.util.DBUtil;
import com.wy.tingshu.util.Log;
import lombok.SneakyThrows;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 * 仓库对象：单表直接访问数据库（Database）的相关操作（相当于之前了解的Dao层）,即负责直接使用SQL对数据库的CURD操作
 * 操作的是Users表
 * 查出来的数据，会以data_object.UserDO来作为具体的表示
 **/
public class UserRepo {
    @SneakyThrows //lombok下的，可以让我们不添加throws也可以正常抛出受查异常
    public void insert(UserDO userDo) {//将userDo对象内容（username+password）插入到用户表中
        /*向users表插入用户名、密码*/
        String sql="insert into users(username,password) values (?,?)";
        try (Connection c= DBUtil.connection()){
            //Statement.RETURN_GENERATED_KEYS:得到自增id
            try(PreparedStatement ps=c.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)){
                ps.setString(1,userDo.username);
                ps.setString(2, userDo.password);
                Log.println("执行SQL："+ps.toString());
                ps.executeUpdate();
                //得到自增id作为uid
                try (ResultSet rs=ps.getGeneratedKeys()){
                    rs.next();
                    userDo.uid=rs.getInt(1);
                }
            }
        }
    }

    //通过用户名在表中查询用户，返回用户名 密码 uid（UserDO对象接收）
    @SneakyThrows
    public UserDO selectOneByUsername(String username) {
        /*通过username查找对应userDO返回*/
        String sql="select uid,username,password from users where username =? ";
        try (Connection c=DBUtil.connection()){
            try (PreparedStatement ps=c.prepareStatement(sql)){
                ps.setString(1,username);
                Log.println("执行SQL："+ps.toString());
                try (ResultSet rs= ps.executeQuery()){
                    if(!rs.next()){//说明没有该用户
                        return null;
                    }
                    //用户存在

                     return new UserDO(
                            rs.getInt("uid"),
                            rs.getString("username"),
                            rs.getString("password")
                    );//直接返回构造方法（不用额外保存数据），构造方法中就是返回给userDO对象的users表中的uid,username和password
                }

            }
        }
    }
}
